package br.com.iswe.gwt.ui.client;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import br.com.iswe.core.entidades.gwt.BeanMap;

/**
 * Classe que carrega as informacoes de ListBox para a classe utilitaria ListBoxLoaderUtil.
 * 
 * @author xzmy1p
 *
 */
public class ListBoxInfo implements Serializable {

	private static final long serialVersionUID = 3546543246745L;
	
	private String controllerName;
	private String listBoxName;
	
	private String item;
	private String value;

	private BeanMap filtro;
	
	protected List<String> 	propriedades = new ArrayList<String>();
	protected List<String> 	orderList = new ArrayList<String>();
	protected List<BeanMap> itens;
	
	private transient boolean includeInCache = true;
	
	private transient Listener<ListBoxInfo> notifyRequestListener;
	
	public ListBoxInfo(){
	}
	
	public ListBoxInfo(String controllerName, String listBoxName) {
		this.controllerName = controllerName;
		this.listBoxName = listBoxName;
	}
	public ListBoxInfo(String controllerName, String listBoxName, String value, String item) {
		this(controllerName, listBoxName);
		setItem( item );
		setValue( value );
	}
	public ListBoxInfo(String controllerName, String listBoxName, String value, String item, BeanMap filtro) {
		this(controllerName, listBoxName);
		this.filtro = filtro;
		setItem( item );
		setValue( value );
	}
	public ListBoxInfo(String controllerName, String listBoxName, String value, String item, String[] propriedadesAdicionais) {
		this(controllerName, listBoxName);
		setItem( item );
		setValue( value );
		propriedades.addAll(Arrays.asList(propriedadesAdicionais));
	}

	public void addProperty(String name){
		propriedades.remove(name);
		propriedades.add(name);
	}
	
	public String getControllerName() {
		return controllerName;
	}
	public void setControllerName(String controllerName) {
		this.controllerName = controllerName;
	}

	public String getListBoxName() {
		return listBoxName;
	}
	public void setListBoxName(String listBoxName) {
		this.listBoxName = listBoxName;
	}

	public String getItem() {
		return item;
	}
	public void setItem(String nome) {
		propriedades.remove(nome);
		propriedades.add(nome);
		this.item = nome;
	}

	public String getValue() {
		return value;
	}
	public void setValue(String nome) {
		propriedades.remove(nome);
		propriedades.add(nome);
		this.value = nome;
	}
	
	public List<BeanMap> getItens() {
		return itens;
	}
	public void setItens(List<BeanMap> itens) {
		this.itens = itens;
	}

	public BeanMap getFiltro() {
		return filtro;
	}

	public void setFiltro(BeanMap filtro) {
		this.filtro = filtro;
	}

	public String[] getProperties() {
		String [] retorno = new String[propriedades.size()];
		for(int x = 0; x < propriedades.size(); x++){
			retorno[x] = (String)propriedades.get(x);
		}
		return retorno;
	}

	public boolean isIncludeInCache() {
		return includeInCache;
	}

	public void setIncludeInCache(boolean includeInCache) {
		this.includeInCache = includeInCache;
	}

	public void notifyRequest() {
		if(notifyRequestListener != null){
			notifyRequestListener.execute(this);
		}
	}

	public Listener<ListBoxInfo> getNotifyRequestListener() {
		return notifyRequestListener;
	}

	public void setNotifyRequestListener(Listener<ListBoxInfo> notifyRequestListener) {
		this.notifyRequestListener = notifyRequestListener;
	}

	public List<String> getOrderList() {
		return orderList;
	}

	public void addOrderPropertyAsc(String property){
		orderList.add("a-" + property);
	}
	public void addOrderPropertyDesc(String property){
		orderList.add("d-" + property);
	}
}
